package router

import (
	"context"
	"fmt"
	"gitee.com/molonglove/goboot/gin"
	"helper-api/app/controller"
	"helper-api/core"
	_ "helper-api/core"
	"net/http"
	"os"
	"os/signal"
	"time"
)

var Engine *gin.Engine

func InitRouter() {
	core.InitCore()
	core.Log.Info("初始化路由配置")
	Engine = gin.Default(core.Log)
	// InitHtml(Engine) // 初始化web目录
	gin.ForceConsoleColor()
	Engine.Use(CorsMiddle())
	Engine.Use(JwtMiddle())
	group := Engine.Group(core.MockConfig.Server.ContextPath)
	{
		group.GET("ws", controller.Ws.WebSocket)
		user := group.Group("user") // 用户模块
		{
			user.POST("login", controller.User.Login)          // 登录
			user.POST("register", controller.User.Register)    // 注册
			user.GET("info", controller.User.GetUserInfo)      // 详情
			user.GET("captcha", controller.User.SendEmailCode) // 验证码
			user.GET("logout", controller.User.Logout)         // 登出
		}
		software := group.Group("software") // 软件模块
		{
			software.POST("page", controller.Software.Page)        // 分页查询
			software.GET("types", controller.Software.Types)       // 软件类型
			software.GET("download", controller.Software.Download) // 下载
			software.POST("create", controller.Software.Create)    // 创建
			software.POST("update", controller.Software.Update)    // 更新
			software.DELETE("delete", controller.Software.Delete)  // 删除
		}
		docker := group.Group("docker") // docker模块
		{
			container := docker.Group("container") // 容器
			{
				container.POST("page", controller.Docker.ContainerList)         // 容器分页查询
				container.POST("operate", controller.Docker.ContainerOperation) // 容器分页查询
			}
			images := docker.Group("images")
			{
				images.POST("page", controller.Docker.ImageList)            // 镜像分页查询
				images.POST("search", controller.Docker.ImageSearch)        // 镜像搜索
				images.GET("pull", controller.Docker.ImagePull)             // 镜像拉取
				images.POST("tags", controller.Docker.ImageTags)            // 镜像Tags
				images.POST("tag", controller.Docker.ImageSetTag)           // 设置镜像Tags
				images.GET("pullResult", controller.Docker.ImagePullResult) // 镜像拉取结果
				images.GET("remove", controller.Docker.ImageDelete)         // 镜像移除
				images.GET("info", controller.Docker.ImageInfo)             // 镜像详情
				images.POST("export", controller.Docker.ImageExport)        // 镜像导出
				images.POST("import", controller.Docker.ImageImport)        // 镜像导入
				images.POST("build", controller.Docker.ImageBuild)          // 镜像构建
				images.POST("clean", controller.Docker.ImageClean)          // 镜像清理
			}
		}
		script := group.Group("script") // 服务
		{
			script.POST("tree", controller.Script.Tree) // 服务Tree查询
			group := script.Group("group")              // 服务分组
			{
				group.POST("page", controller.Script.GroupList)     // 服务分组分页查询
				group.POST("create", controller.Script.GroupCreate) // 服务分组创建
				group.POST("update", controller.Script.GroupUpdate) // 服务分组更新
				group.GET("delete", controller.Script.GroupDelete)  // 服务分组删除
				group.GET("list", controller.Script.GroupList)      // 服务分组列表
			}
			item := script.Group("item")
			{
				item.GET("list", controller.Script.ServerList)      // 获取服务列表
				item.POST("create", controller.Script.ServerCreate) // 服务创建
				item.POST("update", controller.Script.ServerUpdate) // 服务修改
			}
			script := script.Group("script")
			{
				script.GET("list", controller.Script.ScriptList)       // 脚本列表
				script.POST("create", controller.Script.ScriptCreate)  // 脚本创建
				script.GET("execute", controller.Script.ScriptExecute) // 脚本执行
			}
		}
		tools := group.Group("tools") // 系统工具
		{
			file := tools.Group("file") // 文件管理
			{
				file.POST("list", controller.File.FileList)                     // 文件列表
				file.GET("size", controller.File.FileSize)                      // 文件大小
				file.GET("create", controller.File.FileCreate)                  // 文件创建
				file.GET("rename", controller.File.FileRename)                  // 文件重命名
				file.POST("permission", controller.File.FilePermission)         // 文件权限设置
				file.DELETE("delete", controller.File.FileDelete)               // 文件删除
				file.POST("compress", controller.File.FileCompress)             // 文件压缩
				file.POST("uncompress", controller.File.FileUncompress)         // 文件解压
				file.GET("copy", controller.File.FileCopy)                      // 文件复制
				file.GET("remote_download", controller.File.FileRemoteDownload) // 文件远程下载
				file.GET("download", controller.File.FileDownload)              // 文件下载
				file.GET("uploading", controller.File.FileUploading)            // 文件上传
				file.GET("open", controller.File.FileOpen)                      // 文件打开
			}
		}
		authority := group.Group("authority") // 权限管理
		{
			user := authority.Group("user") // 用户模块
			{
				user.GET("resetPasswd", controller.User.ResetPassword) //用户密码重置
				user.GET("detail", controller.User.UserDetail)         //获取某一个用户查询
				user.POST("update", controller.User.UserUpdate)        //更新
				user.POST("page", controller.User.UserPage)            //用户分页查询
				user.GET("delete", controller.User.UserDelete)         // 用户删除
			}
			role := authority.Group("role") // 角色
			{
				role.POST("create", controller.Role.CreateRole) // 创建角色
				role.POST("update", controller.Role.UpdateRole) // 更新角色
				role.POST("page", controller.Role.PageRole)     // 分页角色
				role.GET("delete", controller.Role.DeleteRole)  // 删除角色
				role.GET("all", controller.Role.RoleAll)        // 全部角色
			}
			resource := authority.Group("permission") // 资源
			{
				resource.POST("create", controller.Resource.CreatePermission) // 创建资源
				resource.POST("update", controller.Resource.UpdatePermission) // 修改资源
				resource.GET("tree", controller.Resource.LevelTree)           // 查询资源Tree
				resource.GET("list", controller.Resource.List)                // 查询资源
				resource.GET("info", controller.Resource.Info)                // 资源详情
			}

		}
	}
}

func Run(port int64) {
	InitRouter()
	gin.SetMode(core.MockConfig.Server.RunModel)
	if port == 0 {
		port = core.MockConfig.Server.Port
	}
	core.Log.Info("服务器启动在端口[%d]", port)
	server := &http.Server{
		Addr:           fmt.Sprintf(":%d", port),
		Handler:        Engine,
		ReadTimeout:    30 * time.Second,
		WriteTimeout:   30 * time.Second,
		MaxHeaderBytes: core.MockConfig.Server.MaxHeaderBytes * 1024 * 1024,
	}

	go func() {
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			core.Log.Error("启动服务失败：%s\n", err.Error())
		}
	}()

	// 等待中断信号以优雅地关闭服务器（设置 5 秒的超时时间）
	quit := make(chan os.Signal)
	signal.Notify(quit, os.Interrupt)
	<-quit
	core.Log.Info("服务正在停止")

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := server.Shutdown(ctx); err != nil {
		core.Log.Error("服务停止失败：%s", err.Error())
	}
	core.Log.Info("服务停止")
}
